package com.zw.mes.module.overview.controller;

import com.zw.mes.base.BaseController;
import com.zw.mes.common.JsonResult;
import com.zw.mes.module.assemble.entity.AsseAssemblyRoute;
import com.zw.mes.module.assemble.entity.AsseAssemblySheet;
import com.zw.mes.module.overview.mapper.OverviewMapper;
import com.zw.mes.module.overview.model.OverViewYieldModel;
import com.zw.mes.module.overview.model.PlaCapacityModel;
import com.zw.mes.module.overview.model.ProdArrangeModel;
import com.zw.mes.module.overview.service.OverviewService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author wsg
 * @className OverviewController
 * @description 总览控制层
 * @date 2021/1/30 15:19
 * @versron ver 1.0
 */
@Controller
@RequestMapping("/overview")
@SuppressWarnings("all")
public class OverviewController extends BaseController {

    @Autowired
    private OverviewMapper overviewMapper;
    @Autowired
    private OverviewService overviewService;

    /**
     * index 跳转到首页
     *
     * @param model
     * @return java.lang.String
     * @author wsg
     * @date 2021/06/02 15:19
     */
    @GetMapping("/index")
    @RequiresPermissions({"overview:home:view"})
    public String index(Model model) {
        try {
            /** 第一行 **/
            // 生产令待下达数量
            model.addAttribute("oneRowOneCol1", overviewMapper.getOneRowOneCol1Count());
            // 设备类待排产数量
            model.addAttribute("oneRowOneCol2", overviewMapper.getOneRowOneCol2Count());
            // 其他类待排产数量
            model.addAttribute("oneRowOneCol3", overviewMapper.getOneRowOneCol3Count());

            // 外购件待分配数量
            model.addAttribute("oneRowTwoCol1", overviewMapper.getOneRowTwoCol1Count());
            // 制作件清单待分配数量
            model.addAttribute("oneRowTwoCol2", overviewMapper.getOneRowTwoCol2Count());
            // 工艺卡接收数量
            model.addAttribute("oneRowTwoCol3", overviewMapper.getOneRowTwoCol3Count());
            // 待下料任务数量
            model.addAttribute("oneRowTwoCol4",overviewMapper.getOneRowTwoCol4Count());

            // 装配派工单下达数量
            model.addAttribute("oneRowThreeCol1", overviewMapper.getOneRowThreeCol1Count());
            // 发货清单审核数量
            model.addAttribute("oneRowThreeCol2", overviewMapper.getOneRowThreeCol2Count());
            // 安装派工单下达数量
            model.addAttribute("oneRowThreeCol3", overviewMapper.getOneRowThreeCol3Count());

            /** 第二行 **/
            // 生产任务池零件数
            model.addAttribute("twoRowOneCol", overviewMapper.getTwoRowOneColCount());
            // 半成品库池零件数
            model.addAttribute("twoRowTwoCol", overviewMapper.getTwoRowTwoColCount());
            // 成品库池零件数
            model.addAttribute("twoRowThreeCol", overviewMapper.getTwoRowThreeColCount());

            /** 第三行 **/
            // 待执行项目数
            model.addAttribute("threeRowOneCol1", overviewMapper.getThreeRowOneCol1Count());

            // 待执行项目数
            model.addAttribute("threeRowTwoCol1", overviewMapper.getThreeRowTwoCol1Count());
            // 涂装任务量
            model.addAttribute("threeRowTwoCol2", overviewMapper.getThreeRowTwoCol2Count());

            // 待执行项目数
            model.addAttribute("threeRowThreeCol1", overviewMapper.getThreeRowThreeCol1Count());
            // 机械装配任务量
            model.addAttribute("threeRowThreeCol2", overviewMapper.getThreeRowThreeCol2Count());
            // 流体装配任务量
            model.addAttribute("threeRowThreeCol3", overviewMapper.getThreeRowThreeCol3Count());

            // 待执行项目数
            model.addAttribute("threeRowFourCol1", overviewMapper.getThreeRowFourCol1Count());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "/overview/page";
    }

    /**
     * @param year  统计年
     * @param month 统计月
     * @Author wsg
     * @Date 9:20 2021/7/2
     * @Description 加载铆焊厂产能统计数据 前一月/后一月 使用
     **/
    @PostMapping("/loadWeldPurDataByDate")
    @ResponseBody
    @RequiresPermissions({"overview:home:view"})
    public JsonResult loadWeldPurDataByDate(Integer year, Integer month) {
        /** 业务要求（需要详细理解一下在修改，制定者：陈欣）：
         铆焊产能当前计划量：工艺卡里有铆焊这个路线的零件，重量求和
         1 铆焊当月产能计划量：要连生产计划表，找出计划完成时间在当月的项目，然后再统计这些项目的工艺卡里有铆焊这个路线的零件，重量求和
         2 当月完成量完成量：上述这些零件，其铆焊路线的完成时间在本月的，零件数量求和
         3 计划完成率：当月完成量/当月计划量
         4 排产完成率：按项目统计 **/
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.YEAR, year);
        Date date = calendar.getTime();

        OverViewYieldModel yieldModel = new OverViewYieldModel();
        // 当月计划量（吨）
        Double fourRowOneCol1 = overviewMapper.getFourRowOneCol1Count(date);
        yieldModel.setOneYield(keepTwoDecimal(fourRowOneCol1 / 1000.00));
        // 当月完成量（吨）
        Double fourRowOneCol2 = overviewMapper.getFourRowOneCol2Count(date);
        yieldModel.setTwoYield(keepTwoDecimal(fourRowOneCol2 / 1000.00));
        // 计划完成率（按重量统计）
        yieldModel.setThreeYield(fourRowOneCol1.compareTo(0.00) == 0 ? 0 : keepTwoDecimal((fourRowOneCol2 / fourRowOneCol1) * 100));
        // 排产完成率（按项目统计）
        Double weldCurMonProCount = overviewMapper.getWeldCurMonProCount(date);// 当月计划项目数
        Double weldCurMonOverProCount = overviewMapper.getWeldCurMonOverProCount(date);// 当月完成项目数
        yieldModel.setFourYield(weldCurMonProCount.compareTo(0.00) == 0 ? 0 : keepTwoDecimal((weldCurMonOverProCount / weldCurMonProCount) * 100));
        return JsonResult.success().setData(yieldModel);
    }

    /**
     * @param year  统计年
     * @param month 统计月
     * @Author wsg
     * @Date 9:20 2021/7/2
     * @Description 加载机加厂产能统计数据 前一月/后一月 使用
     **/
    @PostMapping("/loadCutPurDataByDate")
    @ResponseBody
    @RequiresPermissions({"overview:home:view"})
    public JsonResult loadCutPurDataByDate(Integer year, Integer month) {
        /** 业务要求（需要详细理解一下在修改，制定者：陈欣）：
         铆焊产能当前计划量：工艺卡里有铆焊这个路线的零件，重量求和
         1 铆焊当月产能计划量：要连生产计划表，找出计划完成时间在当月的项目，然后再统计这些项目的工艺卡里有铆焊这个路线的零件，重量求和
         2 当月完成量完成量：上述这些零件，其铆焊路线的完成时间在本月的，零件数量求和
         3 计划完成率：当月完成量/当月计划量
         4 排产完成率：按项目统计 **/
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.YEAR, year);
        Date date = calendar.getTime();

        /** 注：由于工艺卡中机加工时填写特殊，如：1.25，表示为1小时25分钟，非标准的小时进制，故统计SQL运算复杂，望周知 **/
        OverViewYieldModel yieldModel = new OverViewYieldModel();
        // 当月计划量（小时）
        Double fourRowTwoCol1 = overviewMapper.getFourRowTwoCol1Count(date);
        yieldModel.setOneYield(fourRowTwoCol1);
        // 当月完成量（小时）
        Double fourRowTwoCol2 = overviewMapper.getFourRowTwoCol2Count(date);
        yieldModel.setTwoYield(fourRowTwoCol2);
        // 计划完成率（按小时统计）
        Double cutCurMonMinuteCount = overviewMapper.getCutCurMonMinuteCount(date);// 当月计划机加分钟数
        Double cutCurMonOverMinuteCount = overviewMapper.getCutCurMonOverMinuteCount(date);// 当月完成机加分钟数
        yieldModel.setThreeYield(cutCurMonMinuteCount.compareTo(0.00) == 0 ? 0 : keepTwoDecimal((cutCurMonOverMinuteCount / cutCurMonMinuteCount) * 100));
        // 排产完成率（按项目统计）
        Double cutCurMonProCount = overviewMapper.getCutCurMonProCount(date);// 当月计划项目数
        Double cutCurMonOverProCount = overviewMapper.getCutCurMonOverProCount(date);// 当月完成项目数
        yieldModel.setFourYield(cutCurMonProCount.compareTo(0.00) == 0 ? 0 : keepTwoDecimal((cutCurMonOverProCount / cutCurMonProCount) * 100));
        return JsonResult.success().setData(yieldModel);
    }

    /**
     * @Author wsg
     * @Date 13:20 2021/6/5
     * @Description 生产令月进度统计 列表
     **/
    @ResponseBody
    @PostMapping("/prodArrange")
    @RequiresPermissions({"overview:home:view"})
    public JsonResult prodArrangeList() {
        List<ProdArrangeModel> list = overviewMapper.findProdArrangeList();
        return jsonResult(list);
    }

    /**
     * 数据保留两位小数处理
     *
     * @param data
     * @return
     */
    private double keepTwoDecimal(Double data) {

        return (double) Math.round(data * 100) / 100;
    }

    /**
     * @Author wsg
     * @Date 13:20 2021/6/10
     * @Description 下料任务维护 页面
     **/
    @GetMapping("/cutMaintain")
    @RequiresPermissions({"overview:home:view"})
    public String page() {
        return "/transposition/cut/list/page";
    }

    /**
     * @Author wsg
     * @Date 15:01 2021/6/10
     * @Description 铆焊分厂工作任务查询 页面
     **/
    @GetMapping("/solderQuery")
    @RequiresPermissions({"overview:home:view"})
    public String solderQuery() {
        return "prodTaskManager/solderQuery/page";
    }

    /**
     * @Author wsg
     * @Date 15:07 2021/6/10
     * @Description 机加分厂工作任务查询 页面
     **/
    @GetMapping("/machiningQuery")
    @RequiresPermissions({"overview:home:view"})
    public String machiningQuery() {
        return "prodTaskManager/machiningQuery/page";
    }

    /**
     * @Author wsg
     * @Date 13:20 2021/6/10
     * @Description 自动化装配任务反馈 页面
     **/
    @GetMapping("/bakcPage")
    @RequiresPermissions({"overview:home:view"})
    public String bakcPage() {
        return "assemble/dispatch/dispatchBack";
    }

    /**
     * @Author wsg
     * @Date 13:27 2021/6/10
     * @Description 机加厂任务量 页面
     **/
    @GetMapping("/macTaskPage/{special}")
    @RequiresPermissions({"overview:home:view"})
    public String macTaskPage(@PathVariable("special") String special, Model model) {
        model.addAttribute("special", special);
        return "overview/subpage/macTaskPage";
    }

    /**
     * @Author wsg
     * @Date 16:20 2021/6/10
     * @Description 机加厂任务量列表
     **/
    @ResponseBody
    @PostMapping("/macTaskList")
    @RequiresPermissions({"overview:home:view"})
    public JsonResult macTaskList(AsseAssemblySheet assemblySheet) {
        startPage();
        List<AsseAssemblySheet> list = overviewService.findAssemblySheetByQuery(assemblySheet);
        return jsonResult(list);
    }

    /**
     * @Author wsg
     * @Date 16:20 2021/6/11
     * @Description 机加厂任务量 路线列表
     **/
    @ResponseBody
    @PostMapping("/macTaskRouteList")
    @RequiresPermissions({"overview:home:view"})
    public JsonResult findMacTaskRouteListBySheetId(Integer sheetId) {
        startPage();
        List<AsseAssemblyRoute> list = overviewService.findMacTaskRouteListBySheetId(sheetId);
        return jsonResult(list);
    }

    /**
     * @Author wsg
     * @Date 09:01 2021/6/11
     * @Description 涂装任务量查询 页面
     **/
    @GetMapping("/coatQuery")
    @RequiresPermissions({"overview:home:view"})
    public String coatQuery() {
        return "overview/subpage/coatPage";
    }

    /**
     * @Author wsg
     * @Date 9:20 2021/6/11
     * @Description 涂装任务量查询 列表
     **/
    @ResponseBody
    @PostMapping("/coatList")
    @RequiresPermissions({"overview:home:view"})
    public JsonResult coatList(AsseAssemblySheet assemblySheet) {
        startPage();
        List<AsseAssemblySheet> list = overviewService.findCoatListByQuery(assemblySheet);
        return jsonResult(list);
    }

    /**
     * @Author wsg
     * @Date 10:01 2021/6/11
     * @Description 铆焊产能统计 页面
     **/
    @GetMapping("/weldStatsQuery/{year}/{month}")
    @RequiresPermissions({"overview:home:view"})
    public String weldStatsQuery(Model model, @PathVariable("year") Integer year, @PathVariable("month") Integer month) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.YEAR, year);
        Date date = calendar.getTime();

        model.addAttribute("plaEndDat", date);
        return "overview/subpage/weldStatsPage";
    }

    /**
     * @Author wsg
     * @Date 10:20 2021/6/11
     * @Description 铆焊产能统计 列表
     **/
    @ResponseBody
    @PostMapping("/weldStatsList")
    @RequiresPermissions({"overview:home:view"})
    public JsonResult weldStatsList(PlaCapacityModel plaCapacityModel) {
        startPage();
        List<PlaCapacityModel> list = overviewService.findWeldStatsByQuery(plaCapacityModel);
        return jsonResult(list);
    }

    /**
     * @Author wsg
     * @Date 16:25 2021/6/11
     * @Description 机加产能统计 页面
     **/
    @GetMapping("/cutStatsQuery/{year}/{month}")
    @RequiresPermissions({"overview:home:view"})
    public String cutStatsQuery(Model model, @PathVariable("year") Integer year, @PathVariable("month") Integer month) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.YEAR, year);
        Date date = calendar.getTime();

        model.addAttribute("plaEndDat", date);
        return "overview/subpage/cutStatsPage";
    }

    /**
     * @Author wsg
     * @Date 16:20 2021/6/11
     * @Description 机加产能统计 列表
     **/
    @ResponseBody
    @PostMapping("/cutStatsList")
    @RequiresPermissions({"overview:home:view"})
    public JsonResult cutStatsList(PlaCapacityModel plaCapacityModel) {
        startPage();
        List<PlaCapacityModel> list = overviewService.findCutStatsByQuery(plaCapacityModel);
        return jsonResult(list);
    }

}
